iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
自我挑戰組

自我挑戰雜記系列 第 17

實作COM Port自動連線功能

  • 分享至 

  • xImage
  •  

這邊的自動連線指的是自動識別電腦連接我們所需使用的線材,一般來說我們電腦在連接RS-485或RS-232通訊協定的裝置都會先到裝置管理員的連接埠確認目前使用的是哪個COM Port。以下圖為例,目前使用的為COM8。
https://ithelp.ithome.com.tw/upload/images/20230921/20151710rxnOvjlFe3.jpg

應用程式就要設計個選擇COM Port、重新整理及連接的按鍵來實現連線功能。
但這樣做對不熟悉COM Port的人來說使用上並不方便。
https://ithelp.ithome.com.tw/upload/images/20230921/20151710jBSSfhTKSi.jpg

所以根據這個需求可以設計一下COM Port自動連線這個功能,流程圖大致就是 每過固定時間檢查COM Port->取得 Port細節->比對Port號->Port連線

每過固定時間檢查COM Port

public SerialPortViewModel()
{
        _timer.Tick += new EventHandler(GetRightPort); //依特定時間間隔執行,直到迴圈完成的程序。
        _timer.Start();
}
public void GetRightPort(object? sender, EventArgs e)
{
        PortsDetailOptions = GetPortsDetail();
        CheckRightPort(PortsDetailOptions);
        ConnectSelectedSerialPort();
        if (CheckConnectAskOrigin == 1 ) CheckOriginDataTimer();  
}

取得 Port細節

public List<string> GetPortsDetail()
        {
            List<string> ports = new List<string>();
            using (ManagementClass i_Entity = new ManagementClass("Win32_PnPEntity"))
            //Win32_PnPEntity類別代表隨插即用裝置的屬性。 
            {
                foreach (ManagementObject i_Inst in i_Entity.GetInstances())
                {
                    string tempPortDetail;
                    Object o_Guid = i_Inst.GetPropertyValue("ClassGuid");
                    if (o_Guid == null || o_Guid.ToString().ToUpper() != "{4D36E978-E325-11CE-BFC1-08002BE10318}")
                        continue; // Skip all devices except device class "PORTS"

                    String s_Caption = i_Inst.GetPropertyValue("Caption").ToString();               //Description
                    String s_Manufact = i_Inst.GetPropertyValue("Manufacturer").ToString();         //Manufacturer
                    String s_DeviceID = i_Inst.GetPropertyValue("PnpDeviceID").ToString();          //Device ID
                    String s_RegPath = "HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Enum\\" + s_DeviceID + "\\Device Parameters";
                    String s_PortName = Registry.GetValue(s_RegPath, "PortName", "").ToString();    //COM Number

                    int s32_Pos = s_Caption.IndexOf(" (COM");
                    if (s32_Pos > 0) // remove COM port from description
                        s_Caption = s_Caption.Substring(0, s32_Pos);

                    tempPortDetail = s_PortName + "-" + s_Caption;
                    ports.Add(tempPortDetail);
                }
            }
            return ports;
        }

比對Port號

public void CheckRightPort(List<string> value)
        {
            string caption;
            foreach (string s in value)
            {
                caption = GetSelectedCaption(s);
                if (caption == "Prolific USB-to-Serial Comm Port" ) //填入線材名稱
                {
                    PortName = GetSelectedPortName(s);
                    CheckConnectAskOrigin = 1;
                    _timer.Stop();
                }
            }
        }

連線所選的Port

private void ConnectSelectedSerialPort()
        {
            if(PortName != null)
            {
                try
                {
                    SelectedSerialPort = new SerialPort(PortName, SelectedSerialPortBaudRateInt, Parity.None, 8, StopBits.One);
                    SelectedSerialPort.Open();
                    ConnectVisibility = Visibility.Hidden;
                    ConnectPCircleVisibility = Visibility.Visible;
                    SelectedSerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedEvent);
                    MainViewTabControlVisibility = Visibility.Visible;
                    SetupProcessPromptMessageTblVisibility = Visibility.Visible;
                    SetupProcessPromptMessageTblText = "Enter the correct password to change the speed limit!";
                    SelectedSerialPortConnectedBool = true;
                    SelectedSerialPortDisconnectedBool = false;
                }
                catch (Exception)
                {
                    _timer.Start();
                    MessageBox.Show("Can Not Open Selected Serial Port!");
                }
            }

        }

上一篇
進度環應用實作
下一篇
WinForm及WPF專案封裝為執行檔
系列文
自我挑戰雜記18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言